/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import clases.EstadoSeccion;
import clases.Rol;
import clases.Seccion;
import clases.SeccionUsuarioRol;
import clases.Usuario;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Rafa
 */
public class DAO_SeccionUsuarioRol {

    Session sesion = null;

    public DAO_SeccionUsuarioRol() {
        this.sesion = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public List<SeccionUsuarioRol> consultaSeccionesUsuariosRoles(boolean iniciar) {
        List<SeccionUsuarioRol> lista = new ArrayList();
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se realiza la consulta
            Query q = sesion.createQuery("from SeccionUsuarioRol");

            //Se recoge el resultado de la consulta
            lista = (List<SeccionUsuarioRol>) q.list();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return lista;
    }

    public SeccionUsuarioRol consultaSeccionUsuarioRolPorId(Integer idResult, boolean iniciar) {
        SeccionUsuarioRol result = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from SeccionUsuarioRol where idSeccionUsuarioRol = '" + idResult + "'");
        //query.setParameter("nombre", nombre);

            //Se recoge el resultado de la consulta
            result = (SeccionUsuarioRol) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return result;
    }

    public SeccionUsuarioRol consultaSeccionUsuarioRolPorSeccion(Seccion seccion, boolean iniciar) {
        SeccionUsuarioRol result = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from SeccionUsuarioRol where idSeccion = '" + seccion.getIdSeccion() + "'");
        //query.setParameter("nombre", nombre);

            //Se recoge el resultado de la consulta
            result = (SeccionUsuarioRol) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return result;
    }

    public SeccionUsuarioRol consultaSeccionUsuarioRolPorUsuario(Usuario usuario, boolean iniciar) {
        SeccionUsuarioRol result = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from SeccionUsuarioRol where idUsuario = '" + usuario.getIdUsuario() + "'");
        //query.setParameter("nombre", nombre);

            //Se recoge el resultado de la consulta
            result = (SeccionUsuarioRol) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return result;
    }

    public SeccionUsuarioRol consultaSeccionUsuarioRolPorRol(Rol rol, boolean iniciar) {
        SeccionUsuarioRol result = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from SeccionUsuarioRol where idRol = '" + rol.getIdRol() + "'");
        //query.setParameter("nombre", nombre);

            //Se recoge el resultado de la consulta
            result = (SeccionUsuarioRol) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return result;
    }

    public SeccionUsuarioRol consultaSeccionUsuarioRolPorTodo(Seccion seccion, Usuario usuario, Rol rol, boolean iniciar) {
        SeccionUsuarioRol result = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from SeccionUsuarioRol where idRol = '" + rol.getIdRol() + "'"
                    + "idSeccion = '" + seccion.getIdSeccion() + "'"
                    + "idUsuario = '" + usuario.getIdUsuario() + "'");
        //query.setParameter("nombre", nombre);

            //Se recoge el resultado de la consulta
            result = (SeccionUsuarioRol) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return result;
    }

    public SeccionUsuarioRol insertaSeccionUsuarioRol(Seccion seccion, Usuario usuario, Rol rol, boolean iniciar) {

        SeccionUsuarioRol result = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            result = new SeccionUsuarioRol(usuario, seccion, rol);
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            sesion.save(result);
            sesion.getTransaction().commit();
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }
        return result;

    }

    public boolean eliminaSeccionUsuarioRol(Integer idSeccion, boolean iniciar) {
        //No se tiene que comenzar una transaccion ya que esta comenzada en la consulta
        boolean correcto = false;
        try {
            if (iniciar) {
                sesion.beginTransaction();
                sesion.delete(consultaSeccionUsuarioRolPorId(idSeccion, false));
            } else {
                sesion.delete(consultaSeccionUsuarioRolPorId(idSeccion, true));
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }
        return correcto;
    }

    public boolean modificaSeccionUsuarioRol(Seccion seccion, Set<Usuario> oldUsuarios, Set<Usuario> newUsuarios, boolean iniciar) {

        boolean correcto = false;
        Usuario[] oldUsers = oldUsuarios.toArray(new Usuario[]{});
        Usuario[] newUsers = newUsuarios.toArray(new Usuario[]{});

        for (int i = 0; i < oldUsers.length; i++) {

            Usuario usOld = oldUsers[i];
            Usuario usNew = newUsers[i];

            /*Se coge el conjunto de roles del usuario y luego se pasa a un array*/
            Set<Rol> rolDeUser = usOld.getRols();
            Rol[] roles = rolDeUser.toArray(new Rol[]{});

            Set<Rol> rolDeUserNew = usNew.getRols();
            Rol[] rolesNew = rolDeUserNew.toArray(new Rol[]{});

            boolean iniciarDentro = true;
            if (iniciar) {
                sesion.beginTransaction();
                iniciarDentro = false;
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            /*Se conculta la antigua y se le actualizan los parametros*/
            for (int k = 0; k < roles.length; k++) {
                correcto = false;
                SeccionUsuarioRol res = consultaSeccionUsuarioRolPorTodo(seccion, usOld, roles[k], iniciarDentro);
                res.setSeccion(seccion);
                res.setUsuario(usNew);
                res.setRol(rolesNew[k]);
                try {
                    sesion.getSessionFactory().getCurrentSession().beginTransaction();

                    sesion.saveOrUpdate(res);
                    sesion.getTransaction().commit();
                    correcto = true;
                } catch (Exception e) {
                    if (sesion.getTransaction() != null) {
                        sesion.getTransaction().rollback();
                    }

                    e.printStackTrace();

                }
            }

        }

        return correcto;
    }

}
